package com.hmall.common.interceptor;

import cn.hutool.core.util.StrUtil;
import com.hmall.common.utils.UserContext;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 在common模块中配置拦截器，因为大部分的微服务到要用到
 */
public class UserInfoInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 1. 从请求头中获取用户信息
        String userInfo = request.getHeader("user-info");

        // 2. 判断
        if (StrUtil.isNotBlank(userInfo)) {
            // 不为空，就将用户信息放入到ThreadLocal中
            UserContext.setUser(Long.valueOf(userInfo));
        }

        // 3. 放行
        return true;
    }

    /**
     * 拦截器生命周期：preHandle() → 2. Controller & Service等 → 3. postHandle()（如有） → 4. afterCompletion()
     * 特殊情况处理如果请求在 preHandle 返回 false（拦截请求）：不会执行 Controller，
     * 但仍会触发 afterCompletion（Spring 5.3+ 行为）。
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 移除用户
        UserContext.removeUser();
    }
}
